﻿/**
* 检查当鼠标在编辑区域点击某标签或选取内容时应该禁用那些插件
* 比如点击到A标签时，应该禁用表格、图片插件
* 当前是在mouseup事件触发
*/
(function(E, $){

var Consts = E.consts,
	Event = E.mod('Event'),
	Selection = E.mod('Selection');

function autoDisablePlugin( e ) {
	var tags = E.config('tagAndDisablePlugin'),
		all = tags['*'],
		names = [],
		Plugin,
		elements = Event.getElement();
	
	var range = Selection.getRange();
	
	// 判断范围边界
	if( Consts.IE ){
		//alert(range.boundingLeft);
	}else{
		//alert(range.startOffset);
	}
	
	// 先根据标签禁用插件
	for(tagName in elements){
		if( tags[tagName] ){
			if( $.isArray( tags[ tagName ] ) ){
				names = names.concat( tags[ tagName ] );
			}else{
				names = '*';
				// ie6下会提示"循环之外不能有break";
				break;
			}
		}
	}
	
	if( '*' === names ){
		for( var i in all ){
			E.disablePlugin( all[i] );
		}
	}else{
		for( var i in all ){
			E.enablePlugin( all[i] );
		}
		
		if( $.isArray(names) && names.length ){
			for( var j in names ){
				E.disablePlugin(names[j]);
			}
		}
	}
	
	// 再根据选取的内容禁用插件
	var html = Selection.getHtml(), text = ''+Selection.getText(), selectedTags = {};
	names = null;
	if(Consts.IE){
		if( html ){
			// IE下通过选取内容的html，判断是否存在预期的标签，比如表格、图片、目录等
			// 注意下面这种写法的后面那个小括弧，是必须的，不能忽略
			/<t(d|h)/i.test(html) && (selectedTags.table = 1);
			/<h2/i.test(html) && (selectedTags.h2 = 1);
			/<h3/i.test(html) && (selectedTags.h3 = 1);
			/<img/i.test(html) && (selectedTags.img = 1);
			/<pre/i.test(html) && (selectedTags.pre = 1);
		}
	}else if(text){
		// FF chrome 等貌似得不到选取区域的html，而只能是text
		// 但是可以得到选取区域的节点，通过遍历节点也可以达到预期效果
		var range = html.getRangeAt(0),
			selectedNodes = range.cloneContents().childNodes,
			nodeName;
		for (var i = 0; i < selectedNodes.length; i++){
			nodeName = selectedNodes[i].nodeName.toLowerCase();
			selectedTags[nodeName] = 1;
		}
	}
	
	// 如果选择的内容包含table则禁用标题、链接、视频、图片、特殊符号插件
	if( selectedTags.talbe ){
		names = tags.selectedTable;
	}else if( text && text.length > 40 ){
	// 如果选择的内容不符合百科链接，则禁用百科链接插件
		names = ['BaikeLink','H1','H2'];
	}
	if( $.isArray(names) && names.length ){
		for( var j in names ){
			E.disablePlugin(names[j]);
		}
	}
}

// 键盘按下事件，处理回车键
Event.bind('mouseup', function(dom, e){
	autoDisablePlugin(e);
});

Event.bind('keyup', function(dom, e){
	autoDisablePlugin(e);
});

})(jQEditor, jQuery);